package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService{
    @Autowired
    private ItemCatMapper itemCatMapper;
    //本方法用于快速获取存储三级商品分类列表的map集合
    public Map<Integer,List<ItemCat>> getMap(){
        //创建一个新的Map集合用来存储分级数据
        Map<Integer,List<ItemCat>> map=new HashMap<>();
        //搜索全表，并用List进行存储
        List<ItemCat> list=itemCatMapper.selectList(null);
        for (ItemCat itemCat:list) {
            //遍历获取每个ItemCat对象的ParentId
            int parentId=itemCat.getParentId();
            //如果map中含有key为parentId的值
            if (map.containsKey(parentId)){
                //追加数据
                map.get(parentId).add(itemCat);
            }else {
                //创建一个新的List集合，并将它添加到map集合中
                List<ItemCat> list2=new ArrayList<>();
                list2.add(itemCat);
                map.put(parentId,list2);
            }
        }
        return map;
    }
    @Override
    public List<ItemCat> findItemCatList(Integer level){
        Map<Integer,List<ItemCat>> map=getMap();
        if (level==1){
            //如果level为1，则返回parentId为0的值
            return map.get(0);
        }else if(level==2){
            return getTwoList(map);
        }else if (level==3){
            return getThreeList(map);
        }
        return null;
    }
    public List<ItemCat> getTwoList( Map<Integer,List<ItemCat>> map){
        //获取全部一级商品分类并储存在oneList列表中
        List<ItemCat> oneList=map.get(0);
        for (ItemCat oneItemCat:oneList) {
            //获取每个一级分类的ID作为二级分类的parentId查询条件
            int parentId=oneItemCat.getId();
            //查询当前一级商品分类下的二级商品分类
            List<ItemCat> twoList=map.get(parentId);
            //将查询到的二级分类信息存储到一级分类的children集合属性下
            oneItemCat.setChildren(twoList);
        }
        //将存储好的1-2级商品分类列表返回
        return oneList;
    }
    public List<ItemCat> getThreeList( Map<Integer,List<ItemCat>> map){
        //获取一级商品分类信息并存储在oneList列表中
        List<ItemCat> oneList=map.get(0);
        for (ItemCat oneItemCat:oneList) {
            //获取一级商品分类信息的ID作为二级商品分类信息的parentId查询条件
            int parentId=oneItemCat.getId();
            //如果一级商品分类下没有二级商品分类，则结束本次循环，遍历下一个一级商品分类
            if (map.get(parentId)==null) continue;
            //查询当前一级商品分类信息下的二级商品分类信息，并存储到列表当中
            List<ItemCat> list=map.get(parentId);
            //将搜索到的当前二级商品分类信息，保存到一级商品的children集合中
            oneItemCat.setChildren(list);
            for (ItemCat twoItemCat:list) {
                //获取二级商品分类的ID作为三级商品分类的信息的parentId查询条件
                int parentIdTwo=twoItemCat.getId();
                //查询当前二级商品分类信息下的三级商品分类信息，并存储到列表当中
                List<ItemCat> listTwo=map.get(parentIdTwo);
                //将当前搜索到的三级商品分类信息，保存到二级商品的children集合中
                twoItemCat.setChildren(listTwo);
            }
        }
        return oneList;
    }
    @Override
    @Transactional
    public void updateItemCatStatus(Integer id,Boolean status){
        UpdateWrapper<ItemCat> updateWrapper=new UpdateWrapper<>();
        updateWrapper.eq("id",id);
        ItemCat itemCat=new ItemCat();
        itemCat.setStatus(status);
        itemCatMapper.update(itemCat,updateWrapper);
    }
    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat){
        itemCatMapper.insert(itemCat);
    }
    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat){
        itemCatMapper.updateById(itemCat);
    }
    @Override
    @Transactional
    public void deleteItemCat(Integer id, Integer level){
        QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
        //如果被删除的商品分类为三级数据，则直接删除
        if (level==3){
            itemCatMapper.deleteById(id);
            //如果被删除的商品分类为二级数据，则先删除三级数据再删除它自己
        }else if(level==2){
            queryWrapper.eq("parent_id",id);
            itemCatMapper.delete(queryWrapper);
            itemCatMapper.deleteById(id);
            //如果被删除的商品分类为一级数据
        }else if(level==1){
            queryWrapper.eq("parent_id",id);
            //获取二级商品分类数据的id（主键）
            List idList=itemCatMapper.selectObjs(queryWrapper);
            //如果没有二级商品分类数据则直接删除一级商品分类数据
            if (idList.size()==0){
                itemCatMapper.deleteById(id);
                //终止程序
                return;
            }
            queryWrapper.clear();
            //用二级分类商品数据的id列表，作为三级分类商品数据的parentId条件
            queryWrapper.in("parent_id",idList);
            //先删三级数据，即parentId为二级数据的ID的数据
            itemCatMapper.delete(queryWrapper);
            //将一二级的id集合到一起
            idList.add(id);
            //最后一二级一起删
            itemCatMapper.deleteBatchIds(idList);
        }
    }
}
